home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / varie / uae-0_64.lha / uae-0.6.4 / src / X86.S < prev    next >
Text File  |  1996-08-14  |  10KB  |  643 lines

  1. /* These are optimized x86 assembly versions of pfield_linetoscr.
  2.  * Feel free to send me Sparc/PPC/Alpha versions of this... :)
  3.  */
  4.  
  5. #ifdef __DOS__
  6. #define SYM(NAME) _##NAME
  7. #define _color_regs _bpl_info
  8. #else
  9. #define SYM(NAME) NAME
  10. #endif
  11.  
  12. /* Urgl... */
  13. #define color_regs bpl_info
  14.  
  15. #ifndef __DOS__
  16.     .local    lastcolor
  17.     .comm    lastcolor,2
  18.     .align 16
  19. #else
  20.     .comm    lastcolor,2
  21.     .align 8
  22. #endif
  23.  
  24. .globl pfield_linetoscr_full8
  25. pfield_linetoscr_full8:
  26.     pushl %ebp
  27.     pushl %edi
  28.     pushl %esi
  29.     pushl %ebx
  30.     movl 20(%esp),%esi
  31.     movl 24(%esp),%edi
  32.     
  33.     xorl %edx,%edx
  34.     movl SYM(diwfirstword),%eax
  35.     cmpl $4,%eax
  36.     jc .Loops1
  37.     movl %edx,SYM(pixdata)-4(%eax)
  38.     movl %edx,SYM(spixstate)-4(%eax)
  39. .Loops1:    
  40.     movl SYM(diwlastword),%eax
  41.     movl %edx,SYM(pixdata)(%eax)
  42.     movl %edx,SYM(spixstate)(%eax)
  43.     
  44.     movl SYM(acolors),%edx
  45.     movb %dl,%dh
  46.     movw %dx,%ax
  47.     bswapl %eax
  48.     movw %dx,%ax
  49.     
  50.     movl SYM(xlinebuffer),%ecx
  51.     leal 4(%esi),%edx
  52.     cmpl %edx,SYM(diwfirstword)
  53.     jle .La_start_ok
  54. .La_start_line:
  55.     cmpl %edi,%esi
  56.     jge .La_start_ok
  57.     movl %eax,(%ecx)
  58.     addl $4,%ecx
  59.     movl %edx,%esi
  60.  
  61.     leal 4(%esi),%edx
  62.     cmpl %edx,SYM(diwfirstword)
  63.     jg .La_start_line
  64. .La_start_ok:
  65.         movl %ecx,SYM(xlinebuffer)
  66.  
  67.         cmpl $0,SYM(bplham)
  68.     je .La_noham
  69.     cmpl $6,SYM(bplplanecnt)
  70.     jne .La_noham
  71.     
  72.     /* HAM 6 */
  73.     movl SYM(xlinebuffer),%ebp
  74.     xorl %edx,%edx
  75. .La_hamloop:
  76.     cmpl %esi,SYM(diwlastword)
  77.     jle .La_hamend
  78.     cmpl %edi,%esi
  79.     jge .La_hamend
  80.         
  81.     movl SYM(ham_linebuf)+12(,%esi,4),%eax
  82.     movb SYM(xcolors)(,%eax,4),%bl
  83.     movl SYM(ham_linebuf)+8(,%esi,4),%eax
  84.     movb SYM(xcolors)(,%eax,4),%bh
  85.     bswapl %ebx
  86.     movl SYM(ham_linebuf)+4(,%esi,4),%eax
  87.     movb SYM(xcolors)(,%eax,4),%bh
  88.     movl SYM(ham_linebuf)(,%esi,4),%eax
  89.     movb SYM(xcolors)(,%eax,4),%bl
  90.     movl %ebx,(%ebp)
  91.     addl $4,%ebp
  92.     addl $4,%esi
  93.     jmp .La_hamloop
  94.  
  95. .La_hamend:
  96.     movl %ebp,SYM(xlinebuffer)
  97.     jmp .La_finish_line
  98.     
  99. .La_noham:
  100.     cmpl $0,SYM(bpldualpf)
  101.     je .La_normal
  102.     
  103.     /* Dual Playfield */
  104.     
  105.     xorl %edx,%edx
  106.  
  107.     movl $SYM(dblpf_ind1),%ebp
  108.     cmpl $0,SYM(bpldualpfpri)
  109.     je .La_dp_loop
  110.     movl $SYM(dblpf_ind2),%ebp
  111. .La_dp_loop:
  112.     cmpl %esi,SYM(diwlastword)
  113.     jle .La_finish_line
  114.     
  115.     cmpl %edi,%esi
  116.     jge .La_finish_line
  117.  
  118.     xorl %edx,%edx
  119.     movl SYM(pixdata)(%esi),%eax
  120.     movl SYM(spixstate)(%esi),%ebx
  121.     testl %ebx,%ebx
  122.     jne .La_dp_sprites
  123.     
  124.     /* no sprites */
  125.  
  126.     movb %al,%dl
  127.     movb (%ebp,%edx,4),%dl
  128.     movb SYM(acolors)(,%edx,4),%cl
  129.     movb %ah,%dl
  130.     movb (%ebp,%edx,4),%dl
  131.     movb SYM(acolors)(,%edx,4),%ch
  132.     bswapl %eax
  133.     bswapl %ecx
  134.     movb %al,%dl
  135.     movb (%ebp,%edx,4),%dl
  136.     movb SYM(acolors)(,%edx,4),%cl
  137.     movb %ah,%dl
  138.     movb (%ebp,%edx,4),%dl
  139.     movb SYM(acolors)(,%edx,4),%ch
  140.     bswapl %ecx
  141.     
  142.     movl SYM(xlinebuffer),%eax
  143.     movl %ecx,(%eax)
  144.     addl $4,SYM(xlinebuffer)
  145.     addl $4,%esi
  146.     jmp .La_dp_loop
  147.     
  148. .La_dp_sprites:
  149.  
  150.         /* dual playfield with sprites */
  151.  
  152.     movb %al,%dl
  153.     testb %bl,%bl
  154.     je .La3
  155.     movb SYM(acolors)(,%edx,4),%cl
  156.     jmp .La1
  157. .La3:
  158.     movb (%ebp,%edx,4),%dl
  159.     movb SYM(acolors)(,%edx,4),%cl
  160. .La1:
  161.  
  162.     movb %ah,%dl
  163.     testb %bh,%bh
  164.     je .La6
  165.     movb SYM(acolors)(,%edx,4),%ch
  166.     jmp .La4
  167. .La6:
  168.     movb (%ebp,%edx,4),%dl
  169.     movb SYM(acolors)(,%edx,4),%ch
  170. .La4:
  171.     bswapl %ecx    
  172.     bswapl %eax
  173.     bswapl %ebx
  174.     
  175.     movb %al,%dl
  176.     testb %bl,%bl
  177.     je .La9
  178.     movb SYM(acolors)(,%edx,4),%cl
  179.     jmp .La7
  180. .La9:
  181.     movb (%ebp,%edx,4),%dl
  182.     movb SYM(acolors)(,%edx,4),%cl
  183. .La7:
  184.  
  185.     movb %ah,%dl
  186.     testb %bh,%bh
  187.     je .La12
  188.     movb SYM(acolors)(,%edx,4),%ch
  189.     jmp .La10
  190. .La12:
  191.     movb (%ebp,%edx,4),%dl
  192.     movb SYM(acolors)(,%edx,4),%ch
  193. .La10:
  194.     addl $4,%esi
  195.     
  196.     bswapl %ecx
  197.     movl SYM(xlinebuffer),%eax
  198.     movl %ecx,(%eax)
  199.     addl $4,SYM(xlinebuffer)
  200.     
  201.     jmp .La_dp_loop
  202.     
  203.     /* normal case */    
  204. .La_normal:
  205.     xorl %edx,%edx
  206.     movl SYM(xlinebuffer),%ebx
  207. .La_normal_loop:
  208.     cmpl %esi,SYM(diwlastword)
  209.     jle .La_normal_end
  210.     cmpl %edi,%esi
  211.     jge .La_normal_end
  212.     
  213.     movl SYM(pixdata)(%esi),%eax
  214.     
  215.     movb %al,%dl
  216.     movb SYM(acolors)(,%edx,4),%cl
  217.     movb %ah,%dl
  218.     movb SYM(acolors)(,%edx,4),%ch
  219.     bswapl %eax
  220.     bswapl %ecx
  221.     movb %al,%dl
  222.     movb SYM(acolors)(,%edx,4),%cl
  223.     movb %ah,%dl
  224.     movb SYM(acolors)(,%edx,4),%ch
  225.     bswapl %ecx
  226.     
  227.     movl %ecx,(%ebx)
  228.     addl $4,%ebx
  229.     addl $4,%esi
  230.     jmp .La_normal_loop
  231.  
  232. .La_normal_end:
  233.     movl %ebx,SYM(xlinebuffer)
  234.  
  235. .La_finish_line:
  236.     /* Finish off the line */
  237.     
  238.     movl SYM(acolors),%edx
  239.     movb %dl,%dh
  240.     movw %dx,%ax
  241.     bswapl %eax
  242.     movw %dx,%ax
  243.     
  244.     movl SYM(xlinebuffer),%ecx
  245. .La_fin_loop:
  246.     cmpl %edi,%esi
  247.     jge .La_fin_end
  248.     
  249.     movl %eax,(%ecx)
  250.     addl $4,%ecx
  251.     addl $4,%esi
  252.     jmp  .La_fin_loop
  253.  
  254. .La_fin_end:
  255.         movl %ecx,SYM(xlinebuffer)
  256.     
  257.     popl %ebx
  258.     popl %esi
  259.     popl %edi
  260.     popl %ebp
  261.     ret
  262.  
  263. #ifndef __DOS__
  264.     .align 16
  265. #else
  266.     .align 8
  267. #endif
  268. .globl pfield_linetoscr_full16
  269. pfield_linetoscr_full16:
  270.     pushl %ebp
  271.     pushl %edi
  272.     pushl %esi
  273.     pushl %ebx
  274.     
  275.     movl 20(%esp),%esi
  276.     movl 24(%esp),%edi
  277.     
  278.     xorl %edx,%edx
  279.     movl SYM(diwfirstword),%eax
  280.     cmpl $4,%eax
  281.     jc .Lboops1
  282.     movl %edx,SYM(pixdata)-4(%eax)
  283.     movl %edx,SYM(spixstate)-4(%eax)
  284. .Lboops1:    
  285.     movl SYM(diwlastword),%eax
  286.     movl %edx,SYM(pixdata)(%eax)
  287.     movl %edx,SYM(spixstate)(%eax)
  288.     
  289.     movl SYM(acolors),%edx
  290.     movw %dx,%ax
  291.     sall $16,%eax
  292.     movw %dx,%ax
  293.     
  294.     movl SYM(xlinebuffer),%ecx
  295.     leal 4(%esi),%edx
  296.     cmpl %edx,SYM(diwfirstword)
  297.     jle .Lb_start_ok
  298. .Lb_start_line:
  299.     cmpl %edi,%esi
  300.     jge .Lb_start_ok
  301.     movl %eax,(%ecx)
  302.     movl %eax,4(%ecx)
  303.     addl $8,%ecx
  304.     movl %edx,%esi
  305.  
  306.     leal 4(%esi),%edx
  307.     cmpl %edx,SYM(diwfirstword)
  308.     jg .Lb_start_line
  309. .Lb_start_ok:
  310.         movl %ecx,SYM(xlinebuffer)
  311.  
  312.         cmpl $0,SYM(bplham)
  313.     je .Lb_noham
  314.     cmpl $6,SYM(bplplanecnt)
  315.     jne .Lb_noham
  316.     
  317.     /* HAM 6 */
  318.     movl SYM(xlinebuffer),%ebp
  319.     xorl %edx,%edx
  320. .Lb_hamloop:
  321.     cmpl %esi,SYM(diwlastword)
  322.     jle .Lb_hamend
  323.     cmpl %edi,%esi
  324.     jge .Lb_hamend
  325.  
  326.     movl SYM(ham_linebuf)+4(,%esi,4),%eax
  327.     movw SYM(xcolors)(,%eax,4),%bx
  328.     sall $16,%ebx
  329.     movl SYM(ham_linebuf)(,%esi,4),%eax
  330.     movw SYM(xcolors)(,%eax,4),%bx
  331.     movl %ebx,(%ebp)
  332.  
  333.     movl SYM(ham_linebuf)+12(,%esi,4),%eax
  334.     movw SYM(xcolors)(,%eax,4),%bx
  335.     sall $16,%ebx
  336.     movl SYM(ham_linebuf)+8(,%esi,4),%eax
  337.     movw SYM(xcolors)(,%eax,4),%bx
  338.     movl %ebx,4(%ebp)
  339.     addl $8,%ebp
  340.     addl $4,%esi
  341.     jmp .Lb_hamloop
  342.  
  343. .Lb_hamend:
  344.     movl %ebp,SYM(xlinebuffer)
  345.     jmp .Lb_finish_line
  346.     
  347. .Lb_noham:
  348.     cmpl $0,SYM(bpldualpf)
  349.     je .Lb_normal
  350.     
  351.     /* Dual Playfield */
  352.     
  353.     xorl %edx,%edx
  354.     movl $SYM(dblpf_ind1),%ebp
  355.     cmpl $0,SYM(bpldualpfpri)
  356.     je .Lb_dp_loop
  357.     movl $SYM(dblpf_ind2),%ebp
  358. .Lb_dp_loop:
  359.     cmpl %esi,SYM(diwlastword)
  360.     jle .Lb_finish_line
  361.     
  362.     cmpl %edi,%esi
  363.     jge .Lb_finish_line
  364.  
  365.     xorl %edx,%edx
  366.     movl SYM(pixdata)(%esi),%eax
  367.     movl SYM(spixstate)(%esi),%ebx
  368.     testl %ebx,%ebx
  369.     jne .Lb_dp_sprites
  370.     
  371.     /* no sprites */
  372.  
  373.         movl SYM(xlinebuffer),%ebx
  374.  
  375.     movb %ah,%dl
  376.     movb (%ebp,%edx,4),%dl
  377.     movw SYM(acolors)(,%edx,4),%cx
  378.     sall $16,%ecx
  379.     movb %al,%dl
  380.     movb (%ebp,%edx,4),%dl
  381.     movw SYM(acolors)(,%edx,4),%cx
  382.     
  383.     movl %ecx,(%ebx)
  384.  
  385.     bswapl %eax
  386.     
  387.     movb %al,%dl
  388.     movb (%ebp,%edx,4),%dl
  389.     movw SYM(acolors)(,%edx,4),%cx
  390.     sall $16,%ecx
  391.     movb %ah,%dl
  392.     movb (%ebp,%edx,4),%dl
  393.     movw SYM(acolors)(,%edx,4),%cx
  394.     
  395.     movl %ecx,4(%ebx)
  396.     addl $8,SYM(xlinebuffer)
  397.     addl $4,%esi
  398.     jmp .Lb_dp_loop
  399.     
  400. .Lb_dp_sprites:
  401.  
  402.         /* dual playfield with sprites */
  403.  
  404.     movb %ah,%dl
  405.     testb %bh,%bh
  406.     je .Lb3
  407.     movw SYM(acolors)(,%edx,4),%cx
  408.     jmp .Lb1
  409. .Lb3:
  410.     movb (%ebp,%edx,4),%dl
  411.     movw SYM(acolors)(,%edx,4),%cx
  412. .Lb1:
  413.         sall $16,%ecx
  414.  
  415.     movb %al,%dl
  416.     testb %bl,%bl
  417.     je .Lb6
  418.     movw SYM(acolors)(,%edx,4),%cx
  419.     jmp .Lb4
  420. .Lb6:
  421.     movb (%ebp,%edx,4),%dl
  422.     mov SYM(acolors)(,%edx,4),%cx
  423. .Lb4:
  424.     movl SYM(xlinebuffer),%edx
  425.     movl %ecx,(%edx)
  426.     xorl %edx,%edx
  427.  
  428.     bswapl %eax
  429.     bswapl %ebx
  430.     
  431.     movb %al,%dl
  432.     testb %bl,%bl
  433.     je .Lb9
  434.     movw SYM(acolors)(,%edx,4),%cx
  435.     jmp .Lb7
  436. .Lb9:
  437.     movb (%ebp,%edx,4),%dl
  438.     movw SYM(acolors)(,%edx,4),%cx
  439. .Lb7:
  440.         sall $16,%ecx
  441.  
  442.     movb %ah,%dl
  443.     testb %bh,%bh
  444.     je .Lb12
  445.     movw SYM(acolors)(,%edx,4),%cx
  446.     jmp .Lb10
  447. .Lb12:
  448.     movb (%ebp,%edx,4),%dl
  449.     movw SYM(acolors)(,%edx,4),%cx
  450. .Lb10:
  451.     addl $4,%esi
  452.     
  453.     movl SYM(xlinebuffer),%eax
  454.     movl %ecx,4(%eax)
  455.     addl $8,SYM(xlinebuffer)
  456.     
  457.     jmp .Lb_dp_loop
  458.     
  459.     /* normal case */    
  460. .Lb_normal:
  461.     xorl %edx,%edx
  462.     movl SYM(xlinebuffer),%ebx
  463. .Lb_normal_loop:
  464.     cmpl %esi,SYM(diwlastword)
  465.     jle .Lb_normal_end
  466.     cmpl %edi,%esi
  467.     jge .Lb_normal_end
  468.     
  469.     movl SYM(pixdata)(%esi),%eax
  470.     
  471.     movb %ah,%dl
  472.     movw SYM(acolors)(,%edx,4),%cx
  473.     sall $16,%ecx
  474.     movb %al,%dl
  475.     movw SYM(acolors)(,%edx,4),%cx
  476.     movl %ecx,(%ebx)
  477.     bswapl %eax
  478.     movb %al,%dl
  479.     movw SYM(acolors)(,%edx,4),%cx
  480.     sall $16,%ecx
  481.     movb %ah,%dl
  482.     movw SYM(acolors)(,%edx,4),%cx
  483.     movl %ecx,4(%ebx)
  484.     
  485.     addl $8,%ebx
  486.     addl $4,%esi
  487.     jmp .Lb_normal_loop
  488.  
  489. .Lb_normal_end:
  490.     movl %ebx,SYM(xlinebuffer)
  491.  
  492. .Lb_finish_line:
  493.     /* Finish off the line */
  494.     
  495.     movw SYM(acolors),%edx
  496.     movw %dx,%ax
  497.     sall $16,%eax
  498.     movw %dx,%ax
  499.     
  500.     movl SYM(xlinebuffer),%ecx
  501. .Lb_fin_loop:
  502.     cmpl %edi,%esi
  503.     jge .Lb_fin_end
  504.     
  505.     movl %eax,(%ecx)
  506.     movl %eax,4(%ecx)
  507.     addl $8,%ecx
  508.     addl $4,%esi
  509.     jmp  .Lb_fin_loop
  510.  
  511. .Lb_fin_end:
  512.         movl %ecx,SYM(xlinebuffer)
  513.     
  514.     popl %ebx
  515.     popl %esi
  516.     popl %edi
  517.     popl %ebp
  518.     ret
  519.  
  520.         .ident    "Crux CC 3.14.15"
  521.  
  522. #ifndef __DOS__
  523.     .align 16
  524. .globl DitherLine
  525.     .type     DitherLine,@function
  526. #else
  527.     .align 8
  528. .globl DitherLine
  529. #endif
  530. DitherLine:
  531.     pushl %ebp
  532.     pushl %edi
  533.     pushl %esi
  534.     pushl %ebx
  535.     movl 20(%esp),%edi
  536.     xorl %ebx,%ebx
  537.     movw 36(%esp),%bx
  538.     movl 32(%esp),%edx
  539.     andl $3,%edx
  540.     sall $15,%edx
  541.     movl 28(%esp),%eax
  542.     andl $3,%eax
  543.     sall $12,%eax
  544.     leal SYM(cidx)(%edx,%eax),%ebp
  545.     xorb %dl,%dl
  546.     movl $8,%ecx
  547.     testl %ebx,%ebx
  548.     je .Li_end
  549.     cmpl $8,40(%esp)
  550.     je .Li_fast
  551.  
  552.     movl 24(%esp),%esi
  553. .Li_loop:
  554.     movzwl (%esi),%eax
  555.     movzbl (%eax,%ebp),%eax
  556.     subl 40(%esp),%ecx
  557.     sall %cl,%eax
  558.     orb %al,%dl
  559.     testl %ecx,%ecx
  560.     jne .Li_1
  561.     movb %dl,(%edi)
  562.     incl %edi
  563.     movl $8,%ecx
  564.     xorb %dl,%dl
  565. .Li_1:
  566.     movzwl 2(%esi),%eax
  567.     movzbl 4096(%ebp,%eax),%eax
  568.     subl 40(%esp),%ecx
  569.     sall %cl,%eax
  570.     orb %al,%dl
  571.     testl %ecx,%ecx
  572.     jne .Li_2
  573.     movb %dl,(%edi)
  574.     incl %edi
  575.     movl $8,%ecx
  576.     xorb %dl,%dl
  577. .Li_2:
  578.     movzwl 4(%esi),%eax
  579.     movzbl 8192(%ebp,%eax),%eax
  580.     subl 40(%esp),%ecx
  581.     sall %cl,%eax
  582.     orb %al,%dl
  583.     testl %ecx,%ecx
  584.     jne .Li_3
  585.     movb %dl,(%edi)
  586.     incl %edi
  587.     movl $8,%ecx
  588.     xorb %dl,%dl
  589. .Li_3:
  590.     movzwl 6(%esi),%eax
  591.     movzbl 12288(%ebp,%eax),%eax
  592.     addl $8,%esi
  593.     subl 40(%esp),%ecx
  594.     sall %cl,%eax
  595.     orb %al,%dl
  596.     testl %ecx,%ecx
  597.     jne .Li_4
  598.     movb %dl,(%edi)
  599.     incl %edi
  600.     movl $8,%ecx
  601.     xorb %dl,%dl
  602. .Li_4:
  603.     subl $4,%ebx
  604.     jne .Li_loop
  605.     jmp .Li_end
  606.     
  607.     /* Fast 8-bit version */
  608. .Li_fast:
  609.     movl 24(%esp),%esi
  610.     xorl %edx,%edx
  611. .Li_fast_loop:
  612.     movl (%esi),%ecx
  613.     movw %cx,%dx
  614.     movb (%edx,%ebp),%al
  615.     
  616.     sarl $16,%ecx
  617.     movw %cx,%dx
  618.     movb 4096(%ebp,%edx),%ah
  619.     bswapl %eax
  620.     
  621.     movl 4(%esi),%ecx
  622.     movw %cx,%dx
  623.     movb 8192(%ebp,%edx),%ah
  624.     
  625.     sarl $16,%ecx
  626.     movw %cx,%dx
  627.     movb 12288(%ebp,%edx),%al
  628.     
  629.     bswapl %eax
  630.     movl %eax,(%edi)
  631.     addl $4,%edi
  632.     addl $8,%esi
  633.     
  634.     subl $4,%ebx
  635.     jne .Li_fast_loop
  636.  
  637. .Li_end:
  638.     popl %ebx
  639.     popl %esi
  640.     popl %edi
  641.     popl %ebp
  642.     ret
  643.